package com.xxx.system.service.impl;

import cn.hutool.core.util.RandomUtil;
import cn.hutool.crypto.SecureUtil;
import com.github.pagehelper.PageHelper;


import com.xxx.blog.domain.ArticleType;
import com.xxx.system.domain.Menu;
import com.xxx.system.mapper.MenuMapper;
import com.xxx.system.query.MenuQuery;
import com.xxx.system.service.IMenuService;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;

@Service
public class MenuServiceImpl implements IMenuService {
    @Autowired
    private MenuMapper menuMapper;

    //查询出所有的类型后传给级联表,这个是角色管理里面的角色菜单的级联表后端
    @Override
    public List<Menu> getTypeTree() {
        //类型树集合
        List<Menu> typeTree = new ArrayList<>();
        //找出所有的数据
        List<Menu> menuList = menuMapper.findAll();
        Map<Long, Menu> map = new HashMap<>();//封装进map集合
        //进行遍历,先把所有的数据放进map集合中
        for (Menu menu : menuList) {
            map.put(menu.getId(), menu);
        }
        //进行遍历判断是否是父类型还是子类型
        for (Menu menu : menuList) {
            Long parentId = menu.getParentId();
            if (parentId == null) {
                typeTree.add(menu);//所有的父类型
            } else {
                Menu parent = map.get(parentId);
                //加强判断,防止父类型为空
                if (parent != null) {
                    //在else里面肯定为子类型,把子类型放入子类型集合中
                    parent.getChildren().add(menu);
                }
            }
        }
        return typeTree;
    }

    @Override
    public List<Menu> findAll() {
        return menuMapper.findAll();
    }

    @Override
    public Menu findOne(Long id) {
        return menuMapper.findOne(id);
    }

    @Override
    public List<Menu> queryPage(MenuQuery menuQuery) {
        PageHelper.startPage(menuQuery.getCurrentPage(), menuQuery.getPageSize());
        return menuMapper.queryPage(menuQuery);
    }

    @Override
    public void addMenu(Menu menu) {
        menuMapper.addMenu(menu);
    }

    @Override
    public void updateMenu(Menu menu) {
        menuMapper.updateMenu(menu);
    }

    @Override
    public void deleteMenu(Long id) {
        menuMapper.deleteMenu(id);
    }

    @Override
    public void batchMenu(Long[] ids) {
        menuMapper.batchMenu(ids);
    }

    //菜单管理里面的级联表后端,这个需要传id来进行判断
    @Override
    public List<Menu> getTypeTree2(Long id) {
        //类型树集合
        List<Menu> typeTree = new ArrayList<>();
        //找出所有的数据
        List<Menu> menuList = menuMapper.findAll();
        Map<Long, Menu> map = new HashMap<>();//封装进map集合
        //进行遍历,先把所有的数据放进map集合中
        for (Menu menu : menuList) {
            map.put(menu.getId(), menu);
        }
        //进行遍历判断是否是父类型还是子类型
        for (Menu menu : menuList) {

            //自己不能选自己当父类型,数据库的行就是row,id拿到类型id,跳过本次循环
            if (id.equals(menu.getId())) {
                continue;
            }

            Long parentId = menu.getParentId();
            if (parentId == null) {
                typeTree.add(menu);//所有的父类型
            } else {
                Menu parent = map.get(parentId);
                //加强判断,防止父类型为空
                if (parent != null) {
                    //在else里面肯定为子类型,把子类型放入子类型集合中
                    parent.getChildren().add(menu);
                }
            }
        }
        return typeTree;
    }
}
